﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sistema.NFe.Xml.Interfaces;
using Sistema.Util;
using System.Xml;

namespace Sistema.NFe.Xml.Versao200
{
    class XmlNFe200 : IXmlNFe
    {
        String _xml;
        decimal _valorTotal;
        String _destinatarioRazaoSocial;
        String _destinatarioEmail;
        long _destinatarioCNPJ;
        long _destinatarioCPF;
        String _naturezaOperacao;
        Int32 _numero;
        Int32 _serie;
        String _IdNota;
        String _xmlSemCabecalho;

        #region Propriedades
        public String XmlSemCabecalho
        {
            get { return PegarXmlSemCabecalho(); }
            set { _xmlSemCabecalho = value; }
        }

        public String IdNota
        {
            get { return _IdNota; }
            set { _IdNota = value; }
        }

        public Int32 Serie
        {
            get { return _serie; }
            set { _serie = value; }
        }

        public Int32 Numero
        {
            get { return _numero; }
            set { _numero = value; }
        }
        public String Xml
        {
            get { return _xml; }
            set
            {
                _xml = value;
                this.LerDadosXml();
            }
        }
        public decimal ValorTotal
        {
            get { return _valorTotal; }
            set { _valorTotal = value; }
        }
        public String DestinatarioRazaoSocial
        {
            get { return _destinatarioRazaoSocial; }
            set { _destinatarioRazaoSocial = value; }
        }
        public String DestinatarioEmail
        {
            get { return _destinatarioEmail; }
            set { _destinatarioEmail = value; }
        }
        public long DestinatarioCNPJ
        {
            get { return _destinatarioCNPJ; }
            set { _destinatarioCNPJ = value; }
        }
        public long DestinatarioCPF
        {
            get { return _destinatarioCPF; }
            set { _destinatarioCPF = value; }
        }
        public String NaturezaOperacao
        {
            get { return _naturezaOperacao; }
            set { _naturezaOperacao = value; }
        }
        #endregion
        
        #region Constructor

        public XmlNFe200()
        {
            this._xml = String.Empty;
            this._xmlSemCabecalho = String.Empty;
            this._valorTotal = new decimal();
            this._destinatarioRazaoSocial = String.Empty;
            this._destinatarioEmail = String.Empty;
            this._destinatarioCNPJ = 0;
            this._destinatarioCPF = 0;
            this._naturezaOperacao = String.Empty;
            this._numero = 0;
            this._serie = 0;
            this._IdNota = String.Empty;
        } 
        #endregion

        private void LerDadosXml()
        {
            Mapeamento.TNFe dados = new Serializacao().Deserialize<Mapeamento.TNFe>(Xml);
            Decimal.TryParse(dados.infNFe.total.ICMSTot.vNF.Replace(".",","), out this._valorTotal);
            this._destinatarioRazaoSocial = dados.infNFe.dest.xNome;
            if (dados.infNFe.dest.ItemElementName == Mapeamento.ItemChoiceType3.CNPJ)
            {
                long.TryParse(dados.infNFe.dest.Item,out this._destinatarioCNPJ);
            }
            else
            {
                long.TryParse(dados.infNFe.dest.Item,out this._destinatarioCPF);
            }
            this.DestinatarioEmail = dados.infNFe.dest.email;
            this.NaturezaOperacao = dados.infNFe.ide.natOp;
            Int32.TryParse(dados.infNFe.ide.nNF,out this._numero);
            Int32.TryParse(dados.infNFe.ide.serie, out this._serie);
            this._IdNota = dados.infNFe.Id;
        }

        private string PegarXmlSemCabecalho()
        {
            XmlDocument documento = new XmlDocument();
            documento.LoadXml(this.Xml);
            foreach (XmlNode a in documento)
            {
                if (a.NodeType == XmlNodeType.XmlDeclaration)
                {
                    documento.RemoveChild(a);
                }
            }
            return documento.OuterXml;
        }
    }
}
